package searchstring;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import util.ConfigurationBean;
import au.com.bytecode.opencsv.CSVReader;

public class StringBuscaLoader {
	private List<QuestaoPesquisa> questoesPesquisa = new ArrayList<QuestaoPesquisa>();
	private static StringBuscaLoader instance;
	private CSVReader reader = null;

	private StringBuscaLoader() {
		try {
			reader = new CSVReader(new FileReader(this.getClass().getClassLoader().getResource(ConfigurationBean.getInstance().get(ConfigurationBean.CSV_STRING_BUSCA_NAME_KEY)).getFile()), ';');
			this.reader();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * This method returns the single instance of the class instance
	 * 
	 * @return {@link StringBuscaLoader}
	 */
	public static StringBuscaLoader getInstance() {
		if (StringBuscaLoader.instance == null) {
			StringBuscaLoader.instance = new StringBuscaLoader();
		}
		return StringBuscaLoader.instance;
	}

	private void reader() throws IOException {
		List<String[]> list = reader.readAll();
		List<TokenStringBusca> stringsBusca = new ArrayList<TokenStringBusca>();
		String questaoPesquisaAtual = "";
		int indexLinha = 0;
		
		for (String[] linha : list) {
			String questaoPesquisaLinha = linha[0];
			if(indexLinha !=0){
				for (int i = 1; i < linha.length; i++) {
					String linhaData = linha[i];

					if(questaoPesquisaAtual.equals("") || questaoPesquisaAtual.equals(questaoPesquisaLinha)){
						TokenStringBusca tokenStringBusca = null;

						if(!linhaData.isEmpty()){
							
							if(linhaData.contains(" ")){
								linhaData = "\"" + linhaData + "\"";
							}
								
							
							if(stringsBusca.size() > i-1){
								tokenStringBusca = stringsBusca.get(i-1);
								tokenStringBusca.getSinonimos().add(linhaData);
							}else{
								tokenStringBusca = new TokenStringBusca();
								tokenStringBusca.getSinonimos().add(linhaData);
								stringsBusca.add(i-1,tokenStringBusca);
							}
						}
					}else{

						addQuestaoPesquisa(stringsBusca, questaoPesquisaAtual);

						questaoPesquisaAtual = "";
						stringsBusca = new ArrayList<TokenStringBusca>();
					}
					
					questaoPesquisaAtual = questaoPesquisaLinha;
				}
			}
			indexLinha++;
		}
		if(!stringsBusca.isEmpty()){
			addQuestaoPesquisa(stringsBusca, questaoPesquisaAtual);
		}
	}

	private void addQuestaoPesquisa(List<TokenStringBusca> stringsBusca,
			String questaoPesquisaAtual) {
		QuestaoPesquisa questaoPesquisa = new QuestaoPesquisa();
		questaoPesquisa.setName(questaoPesquisaAtual);
		questaoPesquisa.setTokensStringBusca(stringsBusca);

		this.questoesPesquisa.add(questaoPesquisa);
	}

	public List<QuestaoPesquisa> getQuestoesPesquisa() {
		return questoesPesquisa;
	}

	public void setQuestoesPesquisa(List<QuestaoPesquisa> questoesPesquisa) {
		this.questoesPesquisa = questoesPesquisa;
	}
}
